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.gzgdb 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.hmakefile 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++.hmakefile 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";