Browse Source

Fix errors on sscanf

%n takes a signed int so is incompatible with size_t; further, sscanf could in theory return a negative value (EOF).
master
JustAnotherArchivist 1 year ago
parent
commit
2d4546f274
2 changed files with 17 additions and 5 deletions
  1. +11
    -3
      http-response-bodies.c
  2. +6
    -2
      warc-dump-responses.c

+ 11
- 3
http-response-bodies.c View File

@@ -34,7 +34,7 @@ int main(int argc, char* argv[]) {
char* m0;
char* m1;
char* eoh;
size_t nscan;
long int nscan;
size_t bytes_read;
size_t length;
bool html_fake_base = false;
@@ -129,10 +129,14 @@ checkstate:
}
m0 += 17;
while (m0 < bufp + n && (*m0 == ' ' || *m0 == '\t')) ++m0;
if (!sscanf(m0, "%zu%n", &length, &nscan)) {
if (sscanf(m0, "%zu%ln", &length, &nscan) <= 0) {
fprintf(stderr, "Error: invalid Content-Length\n");
return 1;
}
if (nscan < 0) {
fprintf(stderr, "Error: negative nscan\n");
return 1;
}
if (nscan > n - (m0 - bufp)) {
fprintf(stderr, "Error: buffer overread\n");
return 1;
@@ -250,10 +254,14 @@ checkstate:
}
m0 = bufp;
while (m0 < bufp + n && (*m0 == ' ' || *m0 == '\t')) ++m0;
if (!sscanf(m0, "%x%n", &length, &nscan)) {
if (sscanf(m0, "%zx%ln", &length, &nscan) <= 0) {
fprintf(stderr, "Error: invalid chunk length\n");
return 1;
}
if (nscan < 0) {
fprintf(stderr, "Error: negative nscan\n");
return 1;
}
if (nscan > n - (m0 - bufp)) {
fprintf(stderr, "Error: buffer overread\n");
return 1;


+ 6
- 2
warc-dump-responses.c View File

@@ -34,7 +34,7 @@ int main(int argc, char* argv[]) {
char* eoh;
size_t record_bytes_read;
size_t record_length;
size_t nscan;
long int nscan;
bool meta = false;

if (argc == 2 && strcmp(argv[1], "--meta") == 0) {
@@ -80,10 +80,14 @@ checkstate:
}
m0 += 17;
while (m0 < bufp + n && (*m0 == ' ' || *m0 == '\t')) ++m0;
if (!sscanf(m0, "%zu%n", &record_length, &nscan)) {
if (sscanf(m0, "%zu%ln", &record_length, &nscan) <= 0) {
fprintf(stderr, "Error: invalid Content-Length\n");
return 1;
}
if (nscan < 0) {
fprintf(stderr, "Error: negative nscan\n");
return 1;
}
if (nscan > n - (m0 - bufp)) {
fprintf(stderr, "Error: buffer overread\n");
return 1;


Loading…
Cancel
Save