summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/phar/phar.c51
1 files changed, 22 insertions, 29 deletions
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 018e6b562f..5b10faf915 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -604,6 +604,23 @@ static int phar_parse_metadata(php_stream *fp, char **buffer, char *endbuffer, z
}
/* }}}*/
+static const char hexChars[] = "0123456789ABCDEF";
+
+static int phar_hex_str(const char *digest, size_t digest_len, char ** signature)
+{
+ int pos = -1;
+ size_t len;
+
+ *signature = (char*)safe_emalloc(digest_len, 2, 1);
+
+ for(len = 0; len < digest_len; ++len) {
+ (*signature)[++pos] = hexChars[((const unsigned char *)digest)[len] >> 4];
+ (*signature)[++pos] = hexChars[((const unsigned char *)digest)[len] & 0x0F];
+ }
+ (*signature)[++pos] = '\0';
+ return pos;
+}
+
/**
* Does not check for a previously opened phar in the cache.
*
@@ -757,13 +774,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int
return FAILURE;
}
- sig_len = sizeof(digest) * 2;
- signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(signature+len+len, "%02X", digest[len]);
- }
- signature[sizeof(digest) * 2] = '\0';
+ sig_len = phar_hex_str(digest, sizeof(digest), &signature);
break;
}
case PHAR_SIG_MD5: {
@@ -798,13 +809,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int
return FAILURE;
}
- sig_len = sizeof(digest) * 2;
- signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(signature+len+len, "%02X", digest[len]);
- }
- signature[sizeof(digest) * 2] = '\0';
+ sig_len = phar_hex_str(digest, sizeof(digest), &signature);
break;
}
default:
@@ -2324,7 +2329,7 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err
/* append signature */
if (global_flags & PHAR_HDR_SIGNATURE) {
unsigned char buf[1024];
- int sig_flags = 0, sig_len, len;
+ int sig_flags = 0, sig_len;
char sig_buf[4];
php_stream_rewind(newfile);
@@ -2348,13 +2353,7 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err
PHP_SHA1Final(digest, &context);
php_stream_write(newfile, (char *) digest, sizeof(digest));
sig_flags |= PHAR_SIG_SHA1;
- archive->signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(archive->signature+len+len, "%02X", digest[len]);
- }
- archive->signature[sizeof(digest) * 2] = '\0';
- archive->sig_len = sizeof(digest) * 2;
+ archive->sig_len = phar_hex_str(digest, sizeof(digest), &archive->signature);
break;
}
case PHAR_SIG_MD5: {
@@ -2368,13 +2367,7 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err
PHP_MD5Final(digest, &context);
php_stream_write(newfile, (char *) digest, sizeof(digest));
sig_flags |= PHAR_SIG_MD5;
- archive->signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(archive->signature+len+len, "%02X", digest[len]);
- }
- archive->signature[sizeof(digest) * 2] = '\0';
- archive->sig_len = sizeof(digest) * 2;
+ archive->sig_len = phar_hex_str(digest, sizeof(digest), &archive->signature);
break;
}
}