Make loose object file reading more careful
[gitweb.git] / test-sha1.c
index 2efc315ee3cfa4cfc7c5d191d9b673d727cc40ea..78d7e983a7a05ba0652132425a66477ef5773304 100644 (file)
@@ -4,21 +4,44 @@ int main(int ac, char **av)
 {
        SHA_CTX ctx;
        unsigned char sha1[20];
+       unsigned bufsz = 8192;
+       char *buffer;
+
+       if (ac == 2)
+               bufsz = strtoul(av[1], NULL, 10) * 1024 * 1024;
+
+       if (!bufsz)
+               bufsz = 8192;
+
+       while ((buffer = malloc(bufsz)) == NULL) {
+               fprintf(stderr, "bufsz %u is too big, halving...\n", bufsz);
+               bufsz /= 2;
+               if (bufsz < 1024)
+                       die("OOPS");
+       }
 
        SHA1_Init(&ctx);
 
        while (1) {
-               ssize_t sz;
-               char buffer[8192];
-               sz = xread(0, buffer, sizeof(buffer));
-               if (sz == 0)
+               ssize_t sz, this_sz;
+               char *cp = buffer;
+               unsigned room = bufsz;
+               this_sz = 0;
+               while (room) {
+                       sz = xread(0, cp, room);
+                       if (sz == 0)
+                               break;
+                       if (sz < 0)
+                               die("test-sha1: %s", strerror(errno));
+                       this_sz += sz;
+                       cp += sz;
+                       room -= sz;
+               }
+               if (this_sz == 0)
                        break;
-               if (sz < 0)
-                       die("test-sha1: %s", strerror(errno));
-               SHA1_Update(&ctx, buffer, sz);
+               SHA1_Update(&ctx, buffer, this_sz);
        }
        SHA1_Final(sha1, &ctx);
        puts(sha1_to_hex(sha1));
        exit(0);
 }
-