tUse in-house memstr() in place of strstr() - sick - sign and check files using ed25519
 (HTM) git clone git://z3bra.org/sick
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 729b4c31f2073cde4f9a641d44e306543d12af2d
 (DIR) parent 21c53931e5f71af23cda059dfffbadc94ab59b5c
 (HTM) Author: z3bra <willyatmailoodotorg>
       Date:   Tue, 13 Sep 2016 21:47:28 +0200
       
       Use in-house memstr() in place of strstr()
       
       Diffstat:
         M sick.c                              |      46 +++++++++++++++++++++++--------
       
       1 file changed, 35 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/sick.c b/sick.c
       t@@ -28,9 +28,10 @@ enum {
        };
        
        static void usage();
       +static char *memstr(const void *h0, size_t k, const char *n0, size_t l);
        static size_t bufferize(char **buf, FILE *fp);
        static size_t extractmsg(unsigned char *msg[], char *buf, size_t len);
       -static size_t extractsig(unsigned char *sig[], char *buf);
       +static size_t extractsig(unsigned char *sig[], char *buf, size_t len);
        static int createkeypair(const char *);
        static int check_keyring(unsigned char *sig, unsigned char *msg, size_t len);
        static int sign(FILE *fp, FILE *key);
       t@@ -49,6 +50,28 @@ usage()
        }
        
        /*
       + * Find a string within a memory chunk, stupid style!
       + */
       +char *
       +memstr(const void *h0, size_t k, const char *n0, size_t l)
       +{
       +        size_t i;
       +        const char *h = h0;
       +
       +        /* Return immediately on empty needle */
       +        if (!l) return (char *)h;
       +
       +        /* Return immediately when needle is longer than haystack */
       +        if (k<l) return 0;
       +
       +        for (i=0; i<(k-l); i++) {
       +                if (memcmp(h+i, n0, l) == 0)
       +                        return (char *)(h+i);
       +        }
       +        return NULL;
       +}
       +
       +/*
         * read chunks of data from a stream into a buffer, and return the size of the
         * buffer
         */
       t@@ -88,7 +111,7 @@ extractmsg(unsigned char **msg, char *buf, size_t buflen)
                char *sig;
        
                /* signature start is identified by SIGBEGIN */
       -        sig = strstr(buf, SIGBEGIN);
       +        sig = memstr(buf, len, SIGBEGIN, strlen(SIGBEGIN));
        
                /* if signature is not found, return the whole buffer */
                if (sig == NULL) {
       t@@ -107,19 +130,20 @@ extractmsg(unsigned char **msg, char *buf, size_t buflen)
         * Copy the signature at the end of the buffer to the given pointer
         */
        static size_t
       -extractsig(unsigned char **sig, char *buf)
       +extractsig(unsigned char **sig, char *buf, size_t len)
        {
                off_t i;
       -        size_t n, len = 0;
       +        size_t n, siglen = 0;
                char *begin, *end, *tmp;
                unsigned char base64[76];
        
                /* search start and end strings for the signatures */
       -        begin = strstr(buf, SIGBEGIN) + strlen(SIGBEGIN);
       -        end   = strstr(buf, SIGEND);
       +        begin = memstr(buf, len, SIGBEGIN, strlen(SIGBEGIN)) + strlen(SIGBEGIN);
       +        if (!begin)
       +                return 0;
        
       -        /* in case the signature block isn't well formated, return 0 */
       -        if (!(begin && end))
       +        end   = memstr(begin, len, SIGEND, strlen(SIGEND));
       +        if (!end)
                        return 0;
        
                /* ed25519 signatures are 64 bytes longs */
       t@@ -148,8 +172,8 @@ extractsig(unsigned char **sig, char *buf)
                        memcpy(base64, begin+i, n);
        
                        n = base64_decode(&tmp, base64, n);
       -                memcpy((*sig) + len, tmp, n);
       -                len += n;
       +                memcpy((*sig) + siglen, tmp, n);
       +                siglen += n;
                        free(tmp);
                }
        
       t@@ -346,7 +370,7 @@ check(FILE *fp, FILE *key)
                if (verbose)
                        fprintf(stderr, "Extracting signature from input\n");
        
       -        if (extractsig(&sig, buf) == 0) {
       +        if (extractsig(&sig, buf, len) == 0) {
                        if (verbose)
                                fprintf(stderr, "ERROR: No signature found\n");