Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Strings verketten in Pidgin-Plugin mit Programmiersprache C
#1
Hallo Leute,
ich habe ein kleines Problem mit einer Zeichenketten-Verkettung, ich habe leider den Code von meinem anderen Plugin verloren, indem ich eine Zeichenketten-Verkettung durchgeführt habe, aber vielleicht könnt ihr mir helfen.

Ganz einfaches Beispiel:

Code:
char *bla = " Halli";
char *blubb  = strcat(bla, " Hallo");

Wenn die Zeile(im Beispiel) 2 im Plugin-Code steht, stürzt Pidgin bei Ausführung ab?!?

Hat jemand einen Rat für mich, wie ich dennoch zwei Zeichenketten verketten kann?

Vielen Dank!
Zitieren
#2
Sorry, ich musste unsere Unterhaltung löschen, weil die Migration des Forums noch nicht abgeschlossen war. :-\

Also ich hatte deinen letzten Post noch gelesen: schau dir mal die manpage von strncat() an. Das will als parameter den Platz, der noch im Puffer frei ist. Du hattest ihm mit strlen() den Platz übergeben, der bereits belegt ist (-1 Byte, weil strlen() afair das NULL-Byte nicht mitzählt...hier muss ich auch jedes Mal nachschauen).
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#3
Ich hab die Unterhaltung noch im rss-Feed:
Freakazoid schrieb:In C brauchst du halt Speicher, der groß genug ist, um die zusätzlichen Zeichen aufzunehmen. Der Speicher für "bla" ist genau 6 Byte groß (5 Zeichen + Nullbyte). strcat schreibt dahinter einfach weiter, wo entweder andere Dinge stehen oder wo kein weiterer Speicher ist. Wenn du Glück hast stürzt dein Programm einfach ab. Ansonsten provoziert es subtile Fehler, die an ganz anderer Stelle auftreten und nur schwer zu finden sind.


Faustregel: Benutze niemals strcat(). Die Funktion ist eine einzige Sicherheitslücke, weil sie die Größe des Zielspeichers nicht übergeben bekommt und daher nicht überprüfen kann, wo sie aufhören muss. strncat() wäre hier eine Alternative.

jamesv1994 schrieb:Ach Gottchen,
du hast natürlich Recht, ich danke dir vielmals!!

und ich habe strcat aus meinem Vokabular gestrichen, vielen Dank für diesen Hinweis!

Was sagst du dazu, fällt dir was "böses" auf?:


Code:
char* systemCall = (char*) malloc(1000);
*systemCall = *"";
char* userResource = (char*) purple_notify_user_info_entry_get_value(e);

strncat(systemCall, "explorer \"\\\\", strlen("explorer \" \\\\"));

strncat(systemCall, userResource, strlen(userResource));
strncat(systemCall, "\\C$\\\"", strlen("\\C$\\\""));

Freakazoid schrieb:Lies mal die manpage zu strncat. Das will wissen, wieviel noch Platz in dem Puffer nach dem String noch ist
Support im Chat einfach einen Nicknamen eingeben, captcha ausfüllen, auf connect drücken, Frage stellen und Geduld mitbringen bis jemand antwortet.
Zitieren
#4
Was du wirklich willst ist aber eigentlich eher die Funktion strdup_printf(). Die allokiert dir automatisch einen Puffer, der genau so groß ist, wie er benötigt wird:
Code:
const char *halli = "halli";
const char *hallo = "hallo";
char *hallihallo = strdup_printf("%s%s", halli, hallo);

...

free(hallihallo);

Du musst nur darauf achten, dass du den Puffer immer (also auch wenn du vorzeitig wegen eines Fehlers abbrichst) mit free() freigibst. Sonst hast du ein Speicherloch und dein RAM läuft irgendwann voll. ^^'

beziehungsweise:
Code:
char *systemCall = strdup_printf("explorer \"%s\"", userResource);
...
free(systemCall);

PS: Je nachdem, ob man userResource in deinem Pidign-Plugin(?) über das Netz beeinflussen kann, baust du dir eine Sicherheitslücke ein. Folgender Wert würde z.B. deine Dokumente löschen (nicht getestet):
Code:
"; del /S /Q %USERPROFILE%
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#5
(23.09.2014, 22:14)Freakazoid schrieb: Was du wirklich willst ist aber eigentlich eher die Funktion strdup_printf(). Die allokiert dir automatisch einen Puffer, der genau so groß ist, wie er benötigt wird:

Code:
const char *halli = "halli";
const char *hallo = "hallo";
char *hallihallo = strdup_printf("%s%s", halli, hallo);

...

free(hallihallo);

Du musst nur darauf achten, dass du den Puffer immer (also auch wenn du vorzeitig wegen eines Fehlers abbrichst) mit free() freigibst. Sonst hast du ein Speicherloch und dein RAM läuft irgendwann voll. ^^'

beziehungsweise:

Code:
char *systemCall = strdup_printf("explorer \"%s\"", userResource);
...
free(systemCall);


PS: Je nachdem, ob man userResource in deinem Pidign-Plugin(?) über das Netz beeinflussen kann, baust du dir eine Sicherheitslücke ein. Folgender Wert würde z.B. deine Dokumente löschen (nicht getestet):
Code:
"; del /S /Q %USERPROFILE%

Oh ich schaue mir die Funktion mal an Big Grin Dankeschön!

hmm also die userResource wird über die accounts.xml gesteuert Smile Wäre also durchaus möglich, dass eine böswillige Änderung durchgeführt wird...
Hast du eine Idee wie ich das umgehen kann?

Danke dir!
Zitieren
#6
Du musst halt nach einer Funktion schauen, der du das Programm und die Argumente getrennt übergeben kannst.

Aber wenn jemand in der Lage ist, Nutzerdateien zu manipulieren, ist das Kind sowieso schon in den Brunnen gefallen. Wink Da kannste es auch so lassen.
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#7
Freakazoid, du hast mir mal wieder super geholfen!
Dankeschön Smile


Edit:

Ein Problem mit der strdup_printf Funktion.
Mein Visual Studio meint sie ist nicht verfügbar.

ich habe aber die string.h inkludiert....
Zitieren
#8
Ups, mein Fehler. Ich meinte g_strdup_printf() aus der glib und zum Freigeben entsprechend g_free().
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#9
Funktioniert wunderbar! Danke Freakazoid! Smile
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste