X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Fdissect-sysfile.c;h=8aadc319445ed7f6e02b4ba169f7ceddc30e8bd2;hb=7bc6f06fcc9f0446c8f52ed351468a5dc25d1ff7;hp=25e2f7f43712b3ffbede9994e711071d03f12e39;hpb=9389f9870643a519cf69b84a9388a0a40315d903;p=pspp diff --git a/tests/dissect-sysfile.c b/tests/dissect-sysfile.c index 25e2f7f437..8aadc31944 100644 --- a/tests/dissect-sysfile.c +++ b/tests/dissect-sysfile.c @@ -102,6 +102,7 @@ static void sys_error (struct sfm_reader *, const char *, ...) NO_RETURN; static void read_bytes (struct sfm_reader *, void *, size_t); +static bool try_read_bytes (struct sfm_reader *, void *, size_t); static int read_int (struct sfm_reader *); static int64_t read_int64 (struct sfm_reader *); static double read_float (struct sfm_reader *); @@ -357,16 +358,20 @@ read_variable_record (struct sfm_reader *r) if (has_variable_label == 1) { long long int offset = ftello (r->file); - size_t len; + size_t len, read_len; char label[255 + 1]; len = read_int (r); - if (len >= sizeof label) - sys_error (r, _("Variable %s has label of invalid length %zu."), - name, len); - read_string (r, label, len + 1); + + /* Read up to 255 bytes of label. */ + read_len = MIN (sizeof label - 1, len); + read_string (r, label, read_len + 1); printf("\t%08llx Variable label: \"%s\"\n", offset, label); + /* Skip unread label bytes. */ + skip_bytes (r, len - read_len); + + /* Skip label padding up to multiple of 4 bytes. */ skip_bytes (r, ROUND_UP (len, 4) - len); } @@ -1075,12 +1080,13 @@ read_compressed_data (struct sfm_reader *r) printf ("\n%08llx: compressed data:\n", (long long int) ftello (r->file)); opcode_idx = N_OPCODES; + opcode_ofs = 0; case_num = 0; for (case_num = 0; ; case_num++) { printf ("%08llx: case %d's uncompressible data begins\n", (long long int) ftello (r->file), case_num); - for (i = 0; i < r->n_var_widths; i++) + for (i = 0; i < r->n_var_widths; ) { int width = r->var_widths[i]; char raw_value[8]; @@ -1089,7 +1095,13 @@ read_compressed_data (struct sfm_reader *r) if (opcode_idx >= N_OPCODES) { opcode_ofs = ftello (r->file); - read_bytes (r, opcodes, 8); + if (i == 0) + { + if (!try_read_bytes (r, opcodes, 8)) + return; + } + else + read_bytes (r, opcodes, 8); opcode_idx = 0; } opcode = opcodes[opcode_idx]; @@ -1103,6 +1115,11 @@ read_compressed_data (struct sfm_reader *r) if (width != 0) printf (", but this is a string variable (width=%d)", width); printf ("\n"); + i++; + break; + + case 0: + printf ("ignored padding\n"); break; case 252: @@ -1114,6 +1131,7 @@ read_compressed_data (struct sfm_reader *r) printf ("uncompressible data: "); print_untyped_value (r, raw_value); printf ("\n"); + i++; break; case 254: @@ -1121,14 +1139,15 @@ read_compressed_data (struct sfm_reader *r) if (width == 0) printf (", but this is a numeric variable"); printf ("\n"); + i++; break; case 255: printf ("SYSMIS"); if (width != 0) printf (", but this is a string variable (width=%d)", width); - printf ("\n"); + i++; break; } @@ -1349,6 +1368,16 @@ read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) read_bytes_internal (r, false, buf, byte_cnt); } +/* Reads BYTE_CNT bytes into BUF. + Returns true if exactly BYTE_CNT bytes are successfully read. + Returns false if an immediate end-of-file is encountered. + Aborts if an I/O error or a partial read occurs. */ +static bool +try_read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) +{ + return read_bytes_internal (r, true, buf, byte_cnt); +} + /* Reads a 32-bit signed integer from R and returns its value in host format. */ static int