Problem mit cgi



  • Habe Probleme mit meinem CGI.
    Beim ausführen bekomme ich ein Segmentation fault.
    Wenn ich die return Anweisungen entferne bekomme ich dieses nicht.
    Beim kompilieren bekomme ich keine Fehlermeldungen oder warnungen.

    cgi.cpp

    #include <iostream>
    #include <string>
    #include <fstream>
    #include "include/libhtml++.h"
    
    using namespace std;
    
    char *cgi::anfrage(char *formname)
    {
    
    char *request = getenv("REQUEST_METHOD");
    
    if( NULL == request )
    { 
    	return NULL;	
    }
    
    else if( strcmp(request, "GET") == 0 )
    {
          query = getenv("QUERY_STRING");
    }
    
    if( query == "0")
    {
    	return NULL;
    }
    
    int start;
    int end;
    
    start = query.find(formname);
    if (query.find(formname) !=string::npos )
    {
    return NULL;
    }
    
    start += 1;
    
    if (query.find("&", start) !=string::npos )
    
    {
    end = query.rfind(formname, end);
    }
    else
    {
    end = query.find("&", start);
    end -= 1;
    }
    
    query.substr(start,end);
    query.copy(formname,string::npos);
    return (formname);
    
    }
    
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    class cgi
    {
    private:
    string  query;
    public:
    char *anfrage(char *formname);
    };
    
    class htmlformsubmit
    {
    private:
    void inputsubmit( string submitname);
    public:
    htmlformsubmit(string submitname)
    {
    inputsubmit(submitname);
    };
    
    };
    
    class htmlformselect
    {
    private:
    void formselectdisplay(string formselectname, string formselectinput, string methodform);
    public:
    htmlformselect(string formselectname, string formselectinput, string methodform)
    {
    formselectdisplay (formselectname, formselectinput, methodform);
    };
    
    };
    
    #include <iostream> 
    #include <fstream>
    #include <string>
    #include "include/css.h"
    #include <tuxcms/libhtml++.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    using namespace std;
    
    void libcss::libcssread()
    {
    		folder = "style";
    		n = scandir(folder, &namelist, 0 , alphasort);
               if (n < 0)
                   perror("No style folder");
               else {
    		while(n--){
    			folders +=( "<option>");
    			folders +=( namelist[n]->d_name);
    			folders +=( "</option>");
    			delete(namelist[n]);
    			}
    		htmlformselect::htmlformselect("cssstyle", folders , "GET");
    		htmlformsubmit::htmlformsubmit("Switch Design");
    		}
    
    delete(namelist);
    }
    
    void libcss::libcssout()
    {
    cgi css;
    string cssstyle;
    cssstyle = css.cgi::anfrage("cssstyle");
    
    cout << "<link rel=\"stylesheet\" type=\"text/css\" href=\"" << folder << "/" << cssstyle << "/"<< "main.css" << "\">" << endl;
    };
    

    link zu quellcode vom programm:
    ftp://tuxist.de/tuxist/tuxcms.tar.gz

    gdb output:

    (gdb) bt
    #0  0x00002b878a678640 in strlen () from /lib/libc.so.6
    #1  0x00002b8789f0dd8c in std::string::operator= ()
       from /usr/lib/libstdc++.so.6
    #2  0x00002b8789c4518b in libcss::libcssout () from /usr/lib/tuxcms/libcss.so
    #3  0x0000000000400e54 in libcss::libcss ()
    #4  0x0000000000400d4b in main ()
    


  • Benutzt du das Makefile?



  • mehrere:

    makefile libcss:

    CXX=g++
    CXXFLAGS= -c -Wall -fpic -L/usr/lib/ -I/usr/include
    CXXFLAGS1= -shared -o libcss.so
    LIBPATH= /usr/lib/tuxcms/libhtml++.so
    
    lib_SRC= \
    	css.cpp
    
    lib_OBJS= \
    	css.o
    
    all:
    	$(CXX) $(CXXFLAGS)   $(lib_SRC)  
    	$(CXX) $(CXXFLAGS1)  $(lib_OBJS) $(LIBPATH)
    
    install:
    	mkdir -p /usr/lib/tuxcms/
    	mkdir -p /usr/include/tuxcms/
    	cp libcss.so /usr/lib/tuxcms/libcss.so
    	cp include/css.h /usr/include/tuxcms/
    
    remove:
    	rm /usr/lib/tuxcms/libcss.so
    	rm /usr/include/tuxcms/css.h
    

    makefile libhtml:

    CXX=g++
    CXXFLAGS= -Wall -c  -fpic -L/usr/lib/ -I/usr/include -Iinclude
    CXXFLAGS1= -shared -o libhtml++.so -Wall
    
    lib_SRC= \
    	htmlform.cpp \
    	cgi.cpp 
    lib_OBJS= \
    	htmlform.o \
    	cgi.o
    
    all:
    	$(CXX) $(CXXFLAGS) $(lib_SRC)
    	$(CXX) $(CXXFLAGS1)  $(lib_OBJS)
    
    install:
    	mkdir -p /usr/lib/tuxcms/
    	mkdir -p /usr/include/tuxcms/
    	cp libhtml++.so /usr/lib/tuxcms/libhtml++.so
    	cp include/libhtml++.h /usr/include/tuxcms/libhtml++.h
    
    remove:
    	rm /usr/lib/tuxcms/libhtml++.so
    	rm /usr/include/tuxcms/libhtml++.h
    

    makefile cgi-bin

    CXX= /usr/bin/g++
    CXXFLAGS= -c -Wall -fsigned-char -L/usr/lib/ -I/usr/include/tuxcms
    CXXFLAGS1= -o index.cgi -Wl
    LIBPATH= /usr/lib/tuxcms/libhtml++.so /usr/lib/tuxcms/libcss.so
    
    lib_SRC= \
    	index.cpp
    lib_OBJS= \
    	index.o
    all:
    	$(CXX) $(CXXFLAGS)  $(lib_SRC) 
    	$(CXX) $(CXXFLAGS1) $(lib_OBJS) $(LIBPATH)
    
    debug:
    	$(CXX) $(CXXFLAGS)  $(lib_SRC) 
    	$(CXX) $(CXXFLAGS1) $(lib_OBJS) $(LIBPATH) -g
    


  • else if( strcmp(request, "GET") == 0 ) 
     { 
           query = getenv("QUERY_STRING"); 
     } 
    
     if( query == "0") 
     { 
         return NULL; 
     }
    

    Das funktioniert so nicht. Wenn QUERY_STRING nicht gesetzt ist, liefert getenv einen 0-Zeiger, den Du dem operator= von std::string übergibst. Da stürzt er ab. Das sieht man auch im gdb-backtrace.



  • habe es gelöst statt return NULL; return "error";


Anmelden zum Antworten