|
|
|
|
@ -709,7 +709,7 @@ static int __bencode_string(const char *s, int offset, int len) {
|
|
|
|
|
unsigned long long sl;
|
|
|
|
|
char *end;
|
|
|
|
|
|
|
|
|
|
for (pos = offset + 1; s[pos] != 0x3a && isdigit(s[pos]) && pos < len; ++pos);
|
|
|
|
|
for (pos = offset + 1; s[pos] != ':' && isdigit(s[pos]) && pos < len; ++pos);
|
|
|
|
|
if (pos == len)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
@ -726,24 +726,24 @@ static int __bencode_string(const char *s, int offset, int len) {
|
|
|
|
|
static int __bencode_integer(const char *s, int offset, int len) {
|
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
|
|
if (s[offset + 1] == 0x2d) {
|
|
|
|
|
if (offset + 3 < len && s[offset + 2] == 0x30 && s[offset + 3] == 0x65) {
|
|
|
|
|
if (s[offset + 1] == '-') {
|
|
|
|
|
if (offset + 3 < len && s[offset + 2] == '0' && s[offset + 3] == 'e') {
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
++offset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (s[offset + 1] == 0x65)
|
|
|
|
|
if (s[offset + 1] == 'e')
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
if (s[offset + 1] == 0x30) {
|
|
|
|
|
if (offset + 2 < len && s[offset + 2] == 0x65)
|
|
|
|
|
if (s[offset + 1] == '0') {
|
|
|
|
|
if (offset + 2 < len && s[offset + 2] == 'e')
|
|
|
|
|
return offset + 3;
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (pos = offset + 1; s[pos] != 0x65 && pos < len; ++pos) {
|
|
|
|
|
if (s[pos] < 0x30 || s[pos] > 0x39)
|
|
|
|
|
for (pos = offset + 1; s[pos] != 'e' && pos < len; ++pos) {
|
|
|
|
|
if (s[pos] < '0' || s[pos] > '9')
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -756,7 +756,7 @@ static int __bencode_integer(const char *s, int offset, int len) {
|
|
|
|
|
static int __bencode_next(const char *s, int offset, int len);
|
|
|
|
|
|
|
|
|
|
static int __bencode_list(const char *s, int offset, int len) {
|
|
|
|
|
for (++offset; s[offset] != 0x65 && offset < len;) {
|
|
|
|
|
for (++offset; s[offset] != 'e' && offset < len;) {
|
|
|
|
|
offset = __bencode_next(s, offset, len);
|
|
|
|
|
if (offset < 0)
|
|
|
|
|
return offset;
|
|
|
|
|
@ -769,7 +769,7 @@ static int __bencode_list(const char *s, int offset, int len) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int __bencode_dictionary(const char *s, int offset, int len) {
|
|
|
|
|
for (++offset; s[offset] != 0x65 && offset < len;) {
|
|
|
|
|
for (++offset; s[offset] != 'e' && offset < len;) {
|
|
|
|
|
offset = __bencode_string(s, offset - 1, len);
|
|
|
|
|
if (offset < 0)
|
|
|
|
|
return offset;
|
|
|
|
|
@ -788,22 +788,22 @@ static int __bencode_next(const char *s, int offset, int len) {
|
|
|
|
|
if (offset >= len)
|
|
|
|
|
return -1;
|
|
|
|
|
switch(s[offset]) {
|
|
|
|
|
case 0x69:
|
|
|
|
|
case 'i':
|
|
|
|
|
return __bencode_integer(s, offset, len);
|
|
|
|
|
case 0x6c:
|
|
|
|
|
case 'l':
|
|
|
|
|
return __bencode_list(s, offset, len);
|
|
|
|
|
case 0x64:
|
|
|
|
|
case 'd':
|
|
|
|
|
return __bencode_dictionary(s, offset, len);
|
|
|
|
|
case 0x30:
|
|
|
|
|
case 0x31:
|
|
|
|
|
case 0x32:
|
|
|
|
|
case 0x33:
|
|
|
|
|
case 0x34:
|
|
|
|
|
case 0x35:
|
|
|
|
|
case 0x36:
|
|
|
|
|
case 0x37:
|
|
|
|
|
case 0x38:
|
|
|
|
|
case 0x39:
|
|
|
|
|
case '0':
|
|
|
|
|
case '1':
|
|
|
|
|
case '2':
|
|
|
|
|
case '3':
|
|
|
|
|
case '4':
|
|
|
|
|
case '5':
|
|
|
|
|
case '6':
|
|
|
|
|
case '7':
|
|
|
|
|
case '8':
|
|
|
|
|
case '9':
|
|
|
|
|
return __bencode_string(s, offset - 1, len);
|
|
|
|
|
}
|
|
|
|
|
return -2;
|
|
|
|
|
|