]> granicus.if.org Git - php/commitdiff
Skip shebang line if present
authorBob Weinand <bobwei9@hotmail.com>
Sat, 1 Aug 2015 19:33:23 +0000 (21:33 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Sat, 1 Aug 2015 21:28:55 +0000 (23:28 +0200)
sapi/phpdbg/phpdbg_prompt.c

index 89e8d027f6c64f3ce9a0289465c0fb4aca14090f..e920f30cdf3bb41bbb1b62d483a4fd93d4341b46 100644 (file)
@@ -443,14 +443,36 @@ PHPDBG_COMMAND(exec) /* {{{ */
 int phpdbg_compile(void) /* {{{ */
 {
        zend_file_handle fh;
+       char *buf;
+       size_t len;
 
        if (!PHPDBG_G(exec)) {
                phpdbg_error("inactive", "type=\"nocontext\"", "No execution context");
                return FAILURE;
        }
 
-       if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE) == SUCCESS) {
+       if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE) == SUCCESS && zend_stream_fixup(&fh, &buf, &len) == SUCCESS) {
+               /* Skip #! line */
+               if (len >= 3 && buf[0] == '#' && buf[1] == '!') {
+                       char *end = buf + len;
+                       do {
+                               switch (fh.handle.stream.mmap.buf++[0]) {
+                                       case '\r':
+                                               if (fh.handle.stream.mmap.buf[0] == '\n') {
+                                                       fh.handle.stream.mmap.buf++;
+                                               }
+                                       case '\n':
+                                               CG(start_lineno) = 2;
+                                               fh.handle.stream.mmap.len -= fh.handle.stream.mmap.buf - buf;
+                                               end = fh.handle.stream.mmap.buf;
+                               }
+                       } while (fh.handle.stream.mmap.buf + 1 < end);
+               }
+
                PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE);
+
+               fh.handle.stream.mmap.buf = buf;
+               fh.handle.stream.mmap.len = len;
                zend_destroy_file_handle(&fh);
                if (EG(exception)) {
                        zend_exception_error(EG(exception), E_ERROR);