Patch opensc-0.11.4.trunk-r3502-fix-segv_print_tags_asn1.diff (for trunk
trunk revision 3502) is draft.


Example 1 (SIGSEGV):

OpenSC Explorer version 0.11.4-svn
OpenSC [3F00]> cd ff00
OpenSC [3F00/FF00]> asn1 0001
Printing tags for buffer of length 512
[Switching to Thread -1211906368 (LWP 25131)]

Breakpoint 1, print_tags_recursive (buf0=0x8066060 "", buf=0x8066060 "",
buflen=512, depth=0)
      at asn1.c:219
219             size_t bytesleft = buflen;
(gdb) p *(char[512]*)buf
$21 = '\0' <repeats 511 times>
(gdb) bt
#0  print_tags_recursive (buf0=0x8066060 "", buf=0x8066060 "",
buflen=512, depth=0) at asn1.c:219
#1  0xb7dc52d8 in sc_asn1_print_tags (buf=0x8066060 "", buflen=512) at
asn1.c:292
#2  0x0804cd9e in do_asn1 (argc=1, argv=0xbfb95864) at
opensc-explorer.c:1571
#3  0x0804d4af in main (argc=1, argv=0xbfb95974) at opensc-explorer.c:1780
(gdb) until 230
print_tags_recursive (buf0=0x8066060 "", buf=0x8066060 "", buflen=512,
depth=0) at asn1.c:230
230                     r = sc_asn1_read_tag(&tagp, bytesleft, &cla,
&tag, &len);
(gdb) p/x cla
$22 = 0xb7eea718
(gdb) p/x tag
$23 = 0xb7d9f8c8
(gdb) s
sc_asn1_read_tag (buf=0xbfb9572c, buflen=512, cla_out=0xbfb95734,
tag_out=0xbfb95730, taglen=0xbfb95728)
      at asn1.c:56
56              const u8 *p = *buf;
(gdb)
57              size_t left = buflen, len;
(gdb)
60              if (left < 2)
(gdb)
62              *buf = NULL;
(gdb)
63              if (*p == 0xff || *p == 0)
(gdb)
65                      return SC_SUCCESS;
(gdb)
111     }
(gdb)
print_tags_recursive (buf0=0x8066060 "", buf=0x8066060 "", buflen=512,
depth=0) at asn1.c:231
231                     if (r != SC_SUCCESS) {
(gdb) p/x cla
$24 = 0xb7eea718
(gdb) p/x tag
$25 = 0xb7d9f8c8
(gdb) n
235                     hlen = tagp - p;
(gdb)
236                     if (cla == 0 && tag == 0) {
(gdb)
240                     for (i = 0; i < depth; i++) {
(gdb)
244                     printf("%02X %s: tag 0x%02X, length %3d: ",
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0xb7dc5108 in print_tags_recursive (buf0=0x8066060 "", buf=0x8066060 "",
buflen=512, depth=0)
      at asn1.c:244


Example 2 ("Illegal length!"):

$ opensc-explorer
OpenSC Explorer version 0.11.4-svn
OpenSC [3F00]> cd ff00
OpenSC [3F00/FF00]> asn1 0001
Printing tags for buffer of length 512
30 Univ: tag 0x10, length 120: SEQUENCE
    30 Univ: tag 0x10, length  39: SEQUENCE
      0C Univ: tag 0x0C, length  30: UTF8STRING [Sample Private Key
(Aktiv Co.)]
      03 Univ: tag 0x03, length   2: BIT STRING [11]
      04 Univ: tag 0x04, length   1: OCTET STRING [02]
    30 Univ: tag 0x10, length  55: SEQUENCE
      04 Univ: tag 0x04, length  42: OCTET STRING
[4944206F662070616972206F66205253412073616D706C65206B6579732028416B74697620436F2E2900]
      03 Univ: tag 0x03, length   2: BIT STRING [100]
      03 Univ: tag 0x03, length   2: BIT STRING [11101]
      02 Univ: tag 0x02, length   1: INTEGER [0]
    A0 Cntx: tag 0x00, length   0:
    A1 Cntx: tag 0x01, length  18:
      30 Univ: tag 0x10, length  16: SEQUENCE
        30 Univ: tag 0x10, length  10: SEQUENCE
          04 Univ: tag 0x04, length   8: OCTET STRING [3F00FF0000000000]
        02 Univ: tag 0x02, length   2: INTEGER [512]
30 Univ: tag 0x10, length 120:  Illegal length!
OpenSC [3F00/FF00]> cat 0001
00000000: 30 78 30 27 0C 1E 53 61 6D 70 6C 65 20 50 72 69
00000010: 76 61 74 65 20 4B 65 79 20 28 41 6B 74 69 76 20
00000020: 43 6F 2E 29 03 02 06 C0 04 01 02 30 37 04 2A 49
00000030: 44 20 6F 66 20 70 61 69 72 20 6F 66 20 52 53 41
00000040: 20 73 61 6D 70 6C 65 20 6B 65 79 73 20 28 41 6B
00000050: 74 69 76 20 43 6F 2E 29 00 03 02 05 20 03 02 03
00000060: B8 02 01 00 A0 00 A1 12 30 10 30 0A 04 08 3F 00
00000070: FF 00 00 00 00 00 02 02 02 00 00 00 00 00 00 00
00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...
000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


diff -u -r opensc-0.11.4.trunk-r3502/src/libopensc/asn1.c 
opensc-0.11.4.trunk-r3502_new/src/libopensc/asn1.c
--- opensc-0.11.4.trunk-r3502/src/libopensc/asn1.c      2008-02-29 
15:37:46.000000000 +0300
+++ opensc-0.11.4.trunk-r3502_new/src/libopensc/asn1.c  2008-04-28 
17:11:00.000000000 +0400
@@ -223,7 +223,7 @@
        const u8 *p = buf;
 
        while (bytesleft >= 2) {
-               unsigned int cla, tag, hlen;
+               unsigned int cla = 0, tag = 0, hlen;
                const u8 *tagp = p;
                size_t len;
 


_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to