Fossil SCM

Fix a problem in /hash-collisions that was causing the links to remain directed to the honeypot.

drh 2015-02-11 13:34 trunk
Commit aa12ac91cf930d0073607690d461b2421a68447c
1 file changed +14 -9
+14 -9
--- src/name.c
+++ src/name.c
@@ -1064,44 +1064,45 @@
10641064
void test_phatoms_cmd(void){
10651065
db_find_and_open_repository(0,0);
10661066
describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0);
10671067
}
10681068
1069
+/* Maximum number of collision examples to remember */
1070
+#define MAX_COLLIDE 25
1071
+
10691072
/*
10701073
** WEBPAGE: hash-collisions
10711074
**
10721075
** Show the number of hash collisions for hash prefixes of various lengths.
10731076
*/
10741077
void hash_collisions_webpage(void){
1075
- int i, kk;
1078
+ int i, j, kk;
10761079
int nHash = 0;
10771080
Stmt q;
10781081
char zPrev[UUID_SIZE+1];
10791082
struct {
10801083
int cnt;
1081
- Blob ex;
1084
+ char *azHit[MAX_COLLIDE];
10821085
char z[UUID_SIZE+1];
10831086
} aCollide[UUID_SIZE+1];
10841087
login_check_credentials();
10851088
if( !g.perm.Read ){ login_needed(); return; }
10861089
memset(aCollide, 0, sizeof(aCollide));
1087
- for(i=0; i<ArraySize(aCollide); i++) blob_init(&aCollide[i].ex,0,0);
10881090
memset(zPrev, 0, sizeof(zPrev));
10891091
db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1");
10901092
while( db_step(&q)==SQLITE_ROW ){
10911093
const char *zUuid = db_column_text(&q,0);
10921094
int n = db_column_bytes(&q,0);
10931095
int i;
10941096
nHash++;
10951097
for(i=0; zPrev[i] && zPrev[i]==zUuid[i]; i++){}
10961098
if( i>0 && i<=UUID_SIZE ){
1099
+ if( i>=4 && aCollide[i].cnt<MAX_COLLIDE ){
1100
+ aCollide[i].azHit[aCollide[i].cnt] = mprintf("%.*s", i, zPrev);
1101
+ }
10971102
aCollide[i].cnt++;
10981103
if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1);
1099
- if( aCollide[i].cnt<25 ){
1100
- blob_appendf(&aCollide[i].ex, " %z%.*s</a>",
1101
- href("%R/whatis/%.*s", i, zPrev), i, zPrev);
1102
- }
11031104
}
11041105
memcpy(zPrev, zUuid, n+1);
11051106
}
11061107
db_finalize(&q);
11071108
style_header("Hash Prefix Collisions");
@@ -1113,18 +1114,22 @@
11131114
@ <tr><td>%d(i)<td>%d(aCollide[i].cnt)<td>%h(aCollide[i].z)</tr>
11141115
}
11151116
@ </tbody></table>
11161117
@ <p>Total number of hashes: %d(nHash)</p>
11171118
kk = 0;
1118
- for(i=UUID_SIZE; i>=0; i--){
1119
+ for(i=UUID_SIZE; i>=4; i--){
11191120
if( aCollide[i].cnt==0 ) continue;
11201121
if( aCollide[i].cnt>200 ) break;
11211122
kk += aCollide[i].cnt;
11221123
if( aCollide[i].cnt<25 ){
11231124
@ <p>Collisions of length %d(i):
11241125
}else{
11251126
@ <p>First 25 collisions of length %d(i):
11261127
}
1127
- @ %s(blob_str(&aCollide[i].ex))</p>
1128
+ for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){
1129
+ char *zId = aCollide[i].azHit[j];
1130
+ if( zId==0 ) continue;
1131
+ @ %z(href("%R/whatis/%s",zId))%h(zId)</a>
1132
+ }
11281133
}
11291134
style_footer();
11301135
}
11311136
--- src/name.c
+++ src/name.c
@@ -1064,44 +1064,45 @@
1064 void test_phatoms_cmd(void){
1065 db_find_and_open_repository(0,0);
1066 describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0);
1067 }
1068
 
 
 
1069 /*
1070 ** WEBPAGE: hash-collisions
1071 **
1072 ** Show the number of hash collisions for hash prefixes of various lengths.
1073 */
1074 void hash_collisions_webpage(void){
1075 int i, kk;
1076 int nHash = 0;
1077 Stmt q;
1078 char zPrev[UUID_SIZE+1];
1079 struct {
1080 int cnt;
1081 Blob ex;
1082 char z[UUID_SIZE+1];
1083 } aCollide[UUID_SIZE+1];
1084 login_check_credentials();
1085 if( !g.perm.Read ){ login_needed(); return; }
1086 memset(aCollide, 0, sizeof(aCollide));
1087 for(i=0; i<ArraySize(aCollide); i++) blob_init(&aCollide[i].ex,0,0);
1088 memset(zPrev, 0, sizeof(zPrev));
1089 db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1");
1090 while( db_step(&q)==SQLITE_ROW ){
1091 const char *zUuid = db_column_text(&q,0);
1092 int n = db_column_bytes(&q,0);
1093 int i;
1094 nHash++;
1095 for(i=0; zPrev[i] && zPrev[i]==zUuid[i]; i++){}
1096 if( i>0 && i<=UUID_SIZE ){
 
 
 
1097 aCollide[i].cnt++;
1098 if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1);
1099 if( aCollide[i].cnt<25 ){
1100 blob_appendf(&aCollide[i].ex, " %z%.*s</a>",
1101 href("%R/whatis/%.*s", i, zPrev), i, zPrev);
1102 }
1103 }
1104 memcpy(zPrev, zUuid, n+1);
1105 }
1106 db_finalize(&q);
1107 style_header("Hash Prefix Collisions");
@@ -1113,18 +1114,22 @@
1113 @ <tr><td>%d(i)<td>%d(aCollide[i].cnt)<td>%h(aCollide[i].z)</tr>
1114 }
1115 @ </tbody></table>
1116 @ <p>Total number of hashes: %d(nHash)</p>
1117 kk = 0;
1118 for(i=UUID_SIZE; i>=0; i--){
1119 if( aCollide[i].cnt==0 ) continue;
1120 if( aCollide[i].cnt>200 ) break;
1121 kk += aCollide[i].cnt;
1122 if( aCollide[i].cnt<25 ){
1123 @ <p>Collisions of length %d(i):
1124 }else{
1125 @ <p>First 25 collisions of length %d(i):
1126 }
1127 @ %s(blob_str(&aCollide[i].ex))</p>
 
 
 
 
1128 }
1129 style_footer();
1130 }
1131
--- src/name.c
+++ src/name.c
@@ -1064,44 +1064,45 @@
1064 void test_phatoms_cmd(void){
1065 db_find_and_open_repository(0,0);
1066 describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0);
1067 }
1068
1069 /* Maximum number of collision examples to remember */
1070 #define MAX_COLLIDE 25
1071
1072 /*
1073 ** WEBPAGE: hash-collisions
1074 **
1075 ** Show the number of hash collisions for hash prefixes of various lengths.
1076 */
1077 void hash_collisions_webpage(void){
1078 int i, j, kk;
1079 int nHash = 0;
1080 Stmt q;
1081 char zPrev[UUID_SIZE+1];
1082 struct {
1083 int cnt;
1084 char *azHit[MAX_COLLIDE];
1085 char z[UUID_SIZE+1];
1086 } aCollide[UUID_SIZE+1];
1087 login_check_credentials();
1088 if( !g.perm.Read ){ login_needed(); return; }
1089 memset(aCollide, 0, sizeof(aCollide));
 
1090 memset(zPrev, 0, sizeof(zPrev));
1091 db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1");
1092 while( db_step(&q)==SQLITE_ROW ){
1093 const char *zUuid = db_column_text(&q,0);
1094 int n = db_column_bytes(&q,0);
1095 int i;
1096 nHash++;
1097 for(i=0; zPrev[i] && zPrev[i]==zUuid[i]; i++){}
1098 if( i>0 && i<=UUID_SIZE ){
1099 if( i>=4 && aCollide[i].cnt<MAX_COLLIDE ){
1100 aCollide[i].azHit[aCollide[i].cnt] = mprintf("%.*s", i, zPrev);
1101 }
1102 aCollide[i].cnt++;
1103 if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1);
 
 
 
 
1104 }
1105 memcpy(zPrev, zUuid, n+1);
1106 }
1107 db_finalize(&q);
1108 style_header("Hash Prefix Collisions");
@@ -1113,18 +1114,22 @@
1114 @ <tr><td>%d(i)<td>%d(aCollide[i].cnt)<td>%h(aCollide[i].z)</tr>
1115 }
1116 @ </tbody></table>
1117 @ <p>Total number of hashes: %d(nHash)</p>
1118 kk = 0;
1119 for(i=UUID_SIZE; i>=4; i--){
1120 if( aCollide[i].cnt==0 ) continue;
1121 if( aCollide[i].cnt>200 ) break;
1122 kk += aCollide[i].cnt;
1123 if( aCollide[i].cnt<25 ){
1124 @ <p>Collisions of length %d(i):
1125 }else{
1126 @ <p>First 25 collisions of length %d(i):
1127 }
1128 for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){
1129 char *zId = aCollide[i].azHit[j];
1130 if( zId==0 ) continue;
1131 @ %z(href("%R/whatis/%s",zId))%h(zId)</a>
1132 }
1133 }
1134 style_footer();
1135 }
1136

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button