Segmentation fault bei Nutzung von cupsGetJobs()

Matt Tellschaft

Grünschnabel
Hallo,

ich versuche gerade ein Programm zu schreiben, welches unter Linux (Gentoo2)Inhalte aus den CUPSscheduler rausschreibt, un diese auf den Bildschirm bringt.

Das Programm heisst gpjid.c und der Code lautet folgendermaßen:
Code:
#include <studio.h>
#include <stdlib.h>
#include <ctype.h>
#include <cups/cups.h>
#include >cups/language.h>

int main(void)
{
int                                i;
int                                num_jobs;
cups_job_t                *jobs;

num_jobs  =  cupsGetJobs(&jobs, Null, 1, 1);
   if (num_jobs > 0)
      {
       printf("%d job(s) found:\n, num_jobs);
       puts(" ");
       puts(" ");

       for (i = 0; i <= num_jobs; i++);
             {
              printf("     %-6d       %-15.15s         %-10.10s          %-10.10s            %dk",
              jobs[i].id, jobs[i].dest, jobs[i].title, jobs[i].user, jobs[i].size);
              cupsFreeJobs(num_jobs, jobs);
             }
        }
   else
       puts("No jobs found");
  return(0);
}


Nach kompilieren mit #gcc -l cups gpijd.c und dem Abrudfen des Programms schreibt er zwar in dem Fall: 10 job(s) found: und dann zwei Leerzeilen, aber danach kommt leider die Meldung Segmentation failed.

Hat jemand von Euch en ähnliches Problem gehabt, und wenn, was kann man an dem Programm korrigieren?

Vielen Dank

Matt
 
Hi,

das cupsGetJobs() reserviert den Speicherplatz. Ich habe aber gerade den Fehler gefunden.

Der Parameter num_jobs, der bei der Funktion cupsFreeJobs() benutzt wurde ist in der Form wie ich ihn bei dem Script reingeschrieben habe um 1 zu groß. Das hat den Segmentation fault verursacht ( das berühmte Buffer overflow ;-)).

Als ich ihn num_jobs - 1 einsetzte war alles in Ordnung.

Danke Trotzdem
 
Stimmt - hatte ich überlesen. num_jobs stimmt schon (ist die Anzahl der jobs) - aber deine for-schleife zählt von 0 bis num_jobs (wegen des <=) - das sind aber num_jobs+1 mal die gezählt werden. => buffer overflow.
 
Hast Recht. In der for Schleife habe ich stattdessen i < num_jobs geschrieben, hab vergessen dies zu schreiben.



Hattu Löcher im Kopp, muttu notieren ;-)
 
Zurück