git.asbjorn.biz
/
swftools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
c4d1967
)
made parser more robust against broken as3
author
Matthias Kramm
<kramm@quiss.org>
Mon, 31 Aug 2009 13:34:43 +0000
(15:34 +0200)
committer
Matthias Kramm
<kramm@quiss.org>
Mon, 31 Aug 2009 13:34:43 +0000
(15:34 +0200)
lib/as3/pool.c
patch
|
blob
|
history
lib/q.c
patch
|
blob
|
history
diff --git
a/lib/as3/pool.c
b/lib/as3/pool.c
index
ec089a0
..
2402328
100644
(file)
--- a/
lib/as3/pool.c
+++ b/
lib/as3/pool.c
@@
-522,14
+522,17
@@
char* multiname_tostring(multiname_t*m)
int namelen = strlen(name);
if(m->type==QNAME || m->type==QNAMEA || m->type==POSTFIXTYPE) {
int namelen = strlen(name);
if(m->type==QNAME || m->type==QNAMEA || m->type==POSTFIXTYPE) {
- char*nsname = escape_string(m->ns->name);
+ char*nsname = m->ns?escape_string(m->ns->name):strdup("NULL");
mname = malloc(strlen(nsname)+namelen+32);
strcpy(mname, "<q");
if(m->type == QNAMEA)
strcat(mname, ",attr");
mname = malloc(strlen(nsname)+namelen+32);
strcpy(mname, "<q");
if(m->type == QNAMEA)
strcat(mname, ",attr");
- strcat(mname, ">[");
- strcat(mname,access2str(m->ns->access));
- strcat(mname, "]");
+ strcat(mname, ">");
+ if(m->ns) {
+ strcat(mname,"[");
+ strcat(mname,access2str(m->ns->access));
+ strcat(mname, "]");
+ }
strcat(mname, nsname);
free(nsname);
strcat(mname, "::");
strcat(mname, nsname);
free(nsname);
strcat(mname, "::");
@@
-1166,6
+1169,9
@@
void pool_read(pool_t*pool, TAG*tag)
if(m.type==0x07 || m.type==0x0d) {
int namespace_index = swf_GetU30(tag);
m.ns = (namespace_t*)array_getkey(pool->x_namespaces, namespace_index);
if(m.type==0x07 || m.type==0x0d) {
int namespace_index = swf_GetU30(tag);
m.ns = (namespace_t*)array_getkey(pool->x_namespaces, namespace_index);
+ if(!m.ns) {
+ fprintf(stderr, "Error: Illegal reference to namespace #%d in constant pool.\n", namespace_index);
+ }
int name_index = swf_GetU30(tag);
if(name_index) // 0 = '*' (any)
m.name = pool_lookup_string(pool, name_index);
int name_index = swf_GetU30(tag);
if(name_index) // 0 = '*' (any)
m.name = pool_lookup_string(pool, name_index);
diff --git
a/lib/q.c
b/lib/q.c
index
fc9f868
..
d70822d
100644
(file)
--- a/
lib/q.c
+++ b/
lib/q.c
@@
-1343,14
+1343,14
@@
array_t* array_new2(type_t*type) {
}
void*array_getkey(array_t*array, int nr) {
if(nr > array->num || nr<0) {
}
void*array_getkey(array_t*array, int nr) {
if(nr > array->num || nr<0) {
- printf("error: reference to element %d in array[%d]\n", nr, array->num);
+ fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num);
return 0;
}
return array->d[nr].name;
}
void*array_getvalue(array_t*array, int nr) {
if(nr > array->num || nr<0) {
return 0;
}
return array->d[nr].name;
}
void*array_getvalue(array_t*array, int nr) {
if(nr > array->num || nr<0) {
- printf("error: reference to element %d in array[%d]\n", nr, array->num);
+ fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num);
return 0;
}
return array->d[nr].data;
return 0;
}
return array->d[nr].data;