OSDN Git Service

fixed to getEditString bugs
authorYoshihiro Yamazaki <yoya@awm.jp>
Wed, 9 Nov 2011 14:08:48 +0000 (23:08 +0900)
committerYoshihiro Yamazaki <yoya@awm.jp>
Wed, 9 Nov 2011 14:08:48 +0000 (23:08 +0900)
- lesser length of variable name mistake match
- segmentation fault when initial_text = NULL

src/php_swfed.c
src/swf_object.c
src/swf_object.h
src/swf_tag.c
src/swf_tag.h
src/swf_tag_edit.c
src/swf_tag_edit.h
src/tests/edit002.phpt [new file with mode: 0644]

index 2afc82c..0d7df52 100644 (file)
@@ -1307,14 +1307,19 @@ PHP_METHOD(swfed, getEditString) {
     swf_object_t *swf = NULL;
     char *data = NULL, *new_buff = NULL;
     int str_len = 0;
+    int error = 0;
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
                               &var_name, &var_name_len) == FAILURE) {
         RETURN_FALSE;
     }
     swf = get_swf_object(getThis() TSRMLS_CC);
-    data = swf_object_get_editstring(swf, var_name, var_name_len);
+    data = swf_object_get_editstring(swf, var_name, var_name_len, &error);
     if (data == NULL) {
-        RETURN_FALSE;
+        if (error) {
+            RETURN_FALSE;
+        } else {
+            RETURN_NULL();
+        }
     }
     str_len = strlen(data);
     new_buff = emalloc(str_len);
index b467081..4adb67d 100644 (file)
@@ -1061,8 +1061,8 @@ swf_object_replace_melodata(swf_object_t *swf, int sound_id,
 
 char *
 swf_object_get_editstring(swf_object_t *swf,
-                          char *variable_name,
-                          int variable_name_len) {
+                          char *variable_name, int variable_name_len,
+                          int *error) {
     swf_tag_t *tag;
     char *data = NULL;
     if (swf == NULL) {
@@ -1075,8 +1075,8 @@ swf_object_get_editstring(swf_object_t *swf,
     }
     for (tag=swf->tag_head ; tag ; tag=tag->next) {
         data = swf_tag_get_edit_string(tag, variable_name,
-                                       variable_name_len, swf);
-        if (data) {
+                                       variable_name_len, error, swf);
+        if (data || (*error == 0)) {
             break;
         }
     }
index 5ed4207..e73adb0 100644 (file)
@@ -119,7 +119,8 @@ extern int swf_object_replace_melodata(swf_object_t *swf, int sound_id,
                                        unsigned long melo_data_len);
 extern char *swf_object_get_editstring(swf_object_t *swf,
                                        char *variable_name,
-                                       int variable_name_len);
+                                       int variable_name_len,
+                                       int *error);
 extern int swf_object_replace_editstring(swf_object_t *swf,
                                          char *variable_name,
                                          int variable_name_len,
index c89aa39..dd900ad 100644 (file)
@@ -859,7 +859,8 @@ swf_tag_replace_melo_data(swf_tag_t *tag, int sound_id,
 char *
 swf_tag_get_edit_string(swf_tag_t *tag,
                         char *variable_name, int variable_name_len,
-                        struct swf_object_ *swf) {
+                        int *error, struct swf_object_ *swf) {
+    *error = 1;
     if (tag == NULL) {
         fprintf(stderr, "swf_tag_get_edit_string: tag == NULL\n");
         return NULL;
@@ -876,7 +877,7 @@ swf_tag_get_edit_string(swf_tag_t *tag,
         return NULL;
     }
     return swf_tag_edit_get_string(tag->detail,
-                                   variable_name, variable_name_len);
+                                   variable_name, variable_name_len, error);
 }
 
 int
index cfd372c..62d1295 100644 (file)
@@ -92,6 +92,7 @@ extern int swf_tag_replace_melo_data(swf_tag_t *tag, int sound_id,
 extern char *swf_tag_get_edit_string(swf_tag_t *tag,
                                      char *variable_name,
                                      int variable_name_len,
+                                     int *error,
                                      struct swf_object_ *swf);
 extern int swf_tag_replace_edit_string(swf_tag_t *tag,
                                        char *variable_name,
index c0df6bf..773e697 100644 (file)
@@ -272,19 +272,27 @@ swf_tag_edit_destroy_detail(swf_tag_t *tag) {
 
 char *
 swf_tag_edit_get_string(void *detail,
-                        char *variable_name, int variable_name_len) {
+                        char *variable_name, int variable_name_len,
+                        int *error) {
     swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) detail;
     char *data, *initial_text;
     int initial_text_len = 0;
-    if (strncmp(swf_tag_edit->edit_variable_name, variable_name, variable_name_len)) {
+    *error = 0;
+
+    if ((strlen(swf_tag_edit->edit_variable_name) != variable_name_len) || strncmp(swf_tag_edit->edit_variable_name, variable_name, variable_name_len)) {
         if (atoi(variable_name) != swf_tag_edit->edit_id) {
+            *error = 1;
             return NULL;
         }
     }
     initial_text = swf_tag_edit->edit_initial_text;
+    if (initial_text == NULL) {
+        return NULL;
+    }
     initial_text_len = strlen(initial_text);
     data = malloc(initial_text_len + 1);
     if (data == NULL) {
+        *error = 1;
         fprintf(stderr, "swf_tag_edit_get_string: Can't malloc\n");
         return NULL;
     }
index c2850be..1ac34e5 100644 (file)
@@ -63,7 +63,8 @@ extern void swf_tag_edit_destroy_detail(swf_tag_t *tag);
 
 extern char *swf_tag_edit_get_string(void *detail,
                                      char *variable_name,
-                                     int variable_name_len);
+                                     int variable_name_len,
+                                     int *error);
 extern int swf_tag_edit_replace_string(void *detail,
                                        char *variable_name,
                                        int variable_name_len,
diff --git a/src/tests/edit002.phpt b/src/tests/edit002.phpt
new file mode 100644 (file)
index 0000000..9c70da6
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+replaceEditString() test;
+--FILE--
+<?php
+
+$swfdata = file_get_contents('tests/textvar.swf');
+$obj = new SWFEditor();
+$obj->input($swfdata);
+var_export($obj->getEditString('textvar'));
+var_export($obj->getEditString('text'));
+var_export($obj->getEditString(''));
+echo PHP_EOL;
+?>
+===DONE===
+--EXPECTF--
+'ABCDEFG'falsefalse
+===DONE===