dpkg: reformat code in read_package_field(), exposing why it's buggy
No binary (build failed)
—
(log yok)
| @@ -548,20 +548,13 @@ static int read_package_field(const char *package_buffer, char **field_name, cha | |
| int next_offset; | |
| int name_length; | |
| int value_length; | |
| - | int exit_flag = FALSE; |
| *field_name = NULL; | |
| *field_value = NULL; | |
| - | if (package_buffer == NULL) { |
| - | return -1; |
| - | } |
| while (1) { | |
| next_offset = offset + 1; | |
| switch (package_buffer[offset]) { | |
| - | case '\0': |
| - | exit_flag = TRUE; |
| - | break; |
| case ':': | |
| if (offset_name_end == 0) { | |
| offset_name_end = offset; | |
| @@ -572,8 +565,7 @@ static int read_package_field(const char *package_buffer, char **field_name, cha | |
| break; | |
| case '\n': | |
| if (package_buffer[next_offset] != ' ') { | |
| - | exit_flag = TRUE; |
| - | break; |
| + | goto end_of_value; |
| } | |
| /* fall through */ | |
| case '\t': | |
| @@ -586,35 +578,31 @@ static int read_package_field(const char *package_buffer, char **field_name, cha | |
| offset_value_start++; | |
| } | |
| break; | |
| - | } |
| - | if (exit_flag) { |
| - | /* Check that the names are valid */ |
| - | name_length = offset_name_end - offset_name_start; |
| - | value_length = offset - offset_value_start; |
| - | if (name_length == 0) { |
| - | break; |
| - | } |
| - | if ((name_length > 0) && (value_length > 0)) { |
| + | case '\0': |
| + | end_of_value: |
| + | /* Check that the names are valid */ |
| + | name_length = offset_name_end - offset_name_start; |
| + | value_length = offset - offset_value_start; |
| + | if ((name_length > 0) && (value_length > 0)) { |
| + | if (name_length > 0) { |
| + | *field_name = xstrndup(&package_buffer[offset_name_start], name_length); |
| + | } |
| + | if (value_length > 0) { |
| + | *field_value = xstrndup(&package_buffer[offset_value_start], value_length); |
| + | } |
| + | return next_offset; |
| + | } |
| + | if (!package_buffer[offset]) |
| + | return next_offset; //BUG! past NUL |
| + | /* Not valid: start fresh with next field */ |
| + | offset_name_start = offset + 1; |
| + | offset_name_end = 0; |
| + | offset_value_start = offset + 1; |
| + | offset++; //BUG? |
| break; | |
| - | } |
| - | |
| - | /* Not valid: start fresh with next field */ |
| - | exit_flag = FALSE; |
| - | offset_name_start = offset + 1; |
| - | offset_name_end = 0; |
| - | offset_value_start = offset + 1; |
| - | offset++; |
| } | |
| offset++; | |
| } /* while (1) */ | |
| - | |
| - | if (name_length > 0) { |
| - | *field_name = xstrndup(&package_buffer[offset_name_start], name_length); |
| - | } |
| - | if (value_length > 0) { |
| - | *field_value = xstrndup(&package_buffer[offset_value_start], value_length); |
| - | } |
| - | return next_offset; |
| } | |
| /* The parameter is NUL-terminated */ | |