diff --git a/src/sbbs3/js_archive.c b/src/sbbs3/js_archive.c
index 3fd1c9259df56b448d0b961deb0a5c3abeda6d26..fe3caf6a9a27d64d6b8ff76468d90df10e48de48 100644
--- a/src/sbbs3/js_archive.c
+++ b/src/sbbs3/js_archive.c
@@ -522,17 +522,28 @@ js_read(JSContext *cx, uintN argc, jsval *arglist)
 
 		for(;;) {
 			result = archive_read_data_block(ar, &buff, &size, &offset);
-			if(result != ARCHIVE_OK)
+			if(result == ARCHIVE_EOF)
 				break;
+			else if(result != ARCHIVE_OK) {
+				JS_ReportError(cx, "archive_read_next_header() returned %d: %s"
+					,result, archive_error_string(ar));
+				retval = JS_FALSE;
+				break;
+			}
 			char* np = realloc(p, total + size);
-			if(np == NULL)
+			if(np == NULL) {
+				JS_ReportError(cx, "realloc failure of %"PRIi64" bytes", total + size);
+				retval = JS_FALSE;
 				break;
+			}
 			p = np;
 			memcpy(p + total, buff, size);
 			total += size;
 		}
-		JSString* js_str = JS_NewStringCopyN(cx, p, total);
-		JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
+		if(retval == JS_TRUE) {
+			JSString* js_str = JS_NewStringCopyN(cx, p, total);
+			JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
+		}
 		free(p);
 		break;
 	}