summaryrefslogtreecommitdiffstats
path: root/src/plugins/abrt-action-analyze-oops.c
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-04-18 14:23:19 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2011-04-18 14:23:19 +0200
commit0a41c4fdf4b242f77445a3e6d73443b40b6e460e (patch)
treee464a61df6653e91a2191950a6056ec70365fbd9 /src/plugins/abrt-action-analyze-oops.c
parent305ba8e8786c32d5292d04e2ed25d1853479a23a (diff)
downloadabrt-0a41c4fdf4b242f77445a3e6d73443b40b6e460e.tar.gz
abrt-0a41c4fdf4b242f77445a3e6d73443b40b6e460e.tar.xz
abrt-0a41c4fdf4b242f77445a3e6d73443b40b6e460e.zip
switch python and oops hashing to sha1
Update sha1 code to a smaller version. Verified that ccpp hashing produces the same results as the old code. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/plugins/abrt-action-analyze-oops.c')
-rw-r--r--src/plugins/abrt-action-analyze-oops.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/plugins/abrt-action-analyze-oops.c b/src/plugins/abrt-action-analyze-oops.c
index 97a7cbf5..8fca109d 100644
--- a/src/plugins/abrt-action-analyze-oops.c
+++ b/src/plugins/abrt-action-analyze-oops.c
@@ -21,11 +21,12 @@
#define PROGNAME "abrt-action-analyze-oops"
-static unsigned hash_oops_str(const char *oops_ptr)
+static void hash_oops_str(char hash_str[SHA1_RESULT_LEN*2 + 1], char *oops_buf, const char *oops_ptr)
{
unsigned char old_c;
unsigned char c = 0;
- unsigned hash = 0;
+
+ char *dst = oops_buf;
/* Special-case: if the first line is of form:
* WARNING: at net/wireless/core.c:614 wdev_cleanup_work+0xe9/0x120 [cfg80211]() (Not tainted)
@@ -41,10 +42,9 @@ static unsigned hash_oops_str(const char *oops_ptr)
oops_ptr += sizeof("WARNING: at ")-1;
while (oops_ptr < p)
{
- c = *oops_ptr++;
- hash = ((hash << 5) ^ (hash >> 27)) ^ c;
+ *dst++ = *oops_ptr++;
}
- return hash;
+ goto gen_hash;
}
}
@@ -111,13 +111,28 @@ static unsigned hash_oops_str(const char *oops_ptr)
// [<c049b460>] ? sys_ioctl+0x40/0x5c
// [<c0403c76>] ? syscall_call+0x7/0xb
- /* An algorithm proposed by Donald E. Knuth in The Art Of Computer
- * Programming Volume 3, under the topic of sorting and search
- * chapter 6.4.
- */
- hash = ((hash << 5) ^ (hash >> 27)) ^ c;
+ *dst++ = c;
+ }
+
+ gen_hash: ;
+
+ unsigned char hash_bytes[SHA1_RESULT_LEN];
+ sha1_ctx_t sha1ctx;
+ sha1_begin(&sha1ctx);
+ sha1_hash(&sha1ctx, oops_buf, dst - oops_buf);
+ sha1_end(&sha1ctx, hash_bytes);
+
+ unsigned len = SHA1_RESULT_LEN;
+ unsigned char *s = hash_bytes;
+ char *d = hash_str;
+ while (len)
+ {
+ *d++ = "0123456789abcdef"[*s >> 4];
+ *d++ = "0123456789abcdef"[*s & 0xf];
+ s++;
+ len--;
}
- return hash;
+ *d = '\0';
}
int main(int argc, char **argv)
@@ -157,12 +172,10 @@ int main(int argc, char **argv)
return 1;
char *oops = dd_load_text(dd, FILENAME_BACKTRACE);
- unsigned hash = hash_oops_str(oops);
- /* free(oops); */
+ char hash_str[SHA1_RESULT_LEN*2 + 1];
+ hash_oops_str(hash_str, oops, oops);
+ free(oops);
- hash &= 0x7FFFFFFF;
- char hash_str[sizeof(int)*3 + 2];
- sprintf(hash_str, "%u", hash);
dd_save_text(dd, FILENAME_UUID, hash_str);
dd_save_text(dd, FILENAME_DUPHASH, hash_str);