]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/queries.c
check buffer size
[netatalk.git] / etc / papd / queries.c
index af5fad79e68936459ca4648795dc71444b164731..658caa02a87f8baf9612aec6d83ff8351cd92f4a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: queries.c,v 1.11 2002-02-15 07:12:41 morgana Exp $
+ * $Id: queries.c,v 1.20 2009-02-02 12:46:45 didg Exp $
  *
  * Copyright (c) 1990,1994 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -50,8 +50,10 @@ int cq_font( struct papfile *, struct papfile * );
 int cq_feature( struct papfile *, struct papfile * );
 int cq_printer( struct papfile *, struct papfile * );
 int cq_rmjob( struct papfile *, struct papfile * );
+#ifndef HAVE_CUPS
 int cq_listq( struct papfile *, struct papfile * );
 int cq_rbilogin( struct papfile *, struct papfile * );
+#endif  /* HAVE_CUPS */
 
 
 
@@ -69,6 +71,9 @@ int cq_default( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start+linelength;
@@ -128,6 +133,9 @@ int cq_k4login( in, out )
 
     case -1 :
        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
     p = start + strlen( comment->c_begin );
@@ -145,13 +153,13 @@ int cq_k4login( in, out )
 
     if (( rc = krb_rd_req( &tkt, "LaserWriter", printer->p_name,
            0, &ad, "" )) != RD_AP_OK ) {
-       LOG(log_error, logtype_default, "cq_k4login: %s", krb_err_txt[ rc ] );
+       LOG(log_error, logtype_papd, "cq_k4login: %s", krb_err_txt[ rc ] );
        append( out, LoginFailed, strlen( LoginFailed ));
        compop();
        CONSUME( in, linelength + crlflength );
        return( CH_DONE );
     }
-    LOG(log_info, logtype_default, "cq_k4login: %s.%s@%s", ad.pname, ad.pinst,
+    LOG(log_info, logtype_papd, "cq_k4login: %s.%s@%s", ad.pname, ad.pinst,
            ad.prealm );
     lp_person( ad.pname );
     lp_host( ad.prealm );
@@ -178,12 +186,15 @@ int cq_uameth( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        if ( comgetflags() == 0 ) {     /* start */
            if (( printer->p_flags & P_KRB ) == 0 ) {   /* no kerberos */
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   LOG(log_error, logtype_default, "cq_uameth: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_uameth: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -255,7 +266,7 @@ int gq_balance( out )
  * Handler for RBISpoolerID
  */
 
-static const char *spoolerid = "(PAPD Spooler) 2.1 (2.1.4 pre-release)\n";
+static const char *spoolerid = "(PAPD Spooler) 1.0 (" VERSION ")\n";
 
 int gq_rbispoolerid( out )
     struct papfile     *out;
@@ -305,7 +316,7 @@ struct genquery {
     { "ADOIsBinaryOK?", gq_true },
     { "UMICHListQueue", gq_true },
     { "UMICHDeleteJob", gq_true },
-    { NULL },
+    { NULL, NULL },
 };
 
 int cq_query( in, out )
@@ -324,6 +335,9 @@ int cq_query( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start+linelength;
@@ -358,7 +372,7 @@ int cq_query( in, out )
            if ( gq->gq_name == NULL || gq->gq_handler == NULL ||
                    (gq->gq_handler)( out ) < 0 ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   LOG(log_error, logtype_default, "cq_feature: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_feature: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -384,14 +398,16 @@ void cq_font_answer( start, stop, out )
 
     p = start;
     while ( p < stop ) {
+        unsigned int count = 0;
        while (( *p == ' ' || *p == '\t' ) && p < stop ) {
            p++;
        }
 
        q = buf;
        while ( *p != ' ' && *p != '\t' &&
-               *p != '\n' && *p != '\r' && p < stop ) {
+               *p != '\n' && *p != '\r' && p < stop && count < sizeof(buf)) {
            *q++ = *p++;
+           count++;
        }
 
        if ( q != buf ) {
@@ -426,6 +442,9 @@ int cq_font( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start + linelength;
@@ -484,6 +503,9 @@ int cq_feature( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start + linelength;
@@ -504,7 +526,7 @@ int cq_feature( in, out )
 
            if (( pfe = ppd_feature( p, stop - p )) == NULL ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   LOG(log_error, logtype_default, "cq_feature: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_feature: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -542,6 +564,9 @@ int cq_printer( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        if ( comgetflags() == 0 ) {
@@ -549,7 +574,7 @@ int cq_printer( in, out )
 
            if (( pdpsver = ppd_feature( psver, strlen( psver ))) == NULL ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   LOG(log_error, logtype_default, "cq_printer: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -561,9 +586,9 @@ int cq_printer( in, out )
                }
            }
            if ( *p == '\0' ) {
-               LOG(log_error, logtype_default, "cq_printer: can't parse PSVersion!" );
+               LOG(log_error, logtype_papd, "cq_printer: can't parse PSVersion!" );
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   LOG(log_error, logtype_default, "cq_printer: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -571,7 +596,7 @@ int cq_printer( in, out )
 
            if (( pdprod = ppd_feature( prod, strlen( prod ))) == NULL ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   LOG(log_error, logtype_default, "cq_printer: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -600,6 +625,8 @@ int cq_printer( in, out )
     }
 }
 
+#ifndef HAVE_CUPS
+
 static const char      *rmjobfailed = "Failed\n";
 static const char      *rmjobok = "Ok\n";
 
@@ -616,6 +643,9 @@ int cq_rmjob( in, out )
 
     case -1 :
        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
     stop = start + linelength;
@@ -656,16 +686,20 @@ int cq_listq( in, out )
 
     case -1 :
        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
     if ( lp_queue( out )) {
-       LOG(log_error, logtype_default, "cq_listq: lp_queue failed" );
+       LOG(log_error, logtype_papd, "cq_listq: lp_queue failed" );
     }
 
     compop();
     CONSUME( in, linelength + crlflength );
     return( CH_DONE );
 }
+#endif /* HAVE_CUPS */
 
 
 /*
@@ -677,7 +711,7 @@ static const char *rbiloginok = "0\r";
 static const char *rbiloginbad = "-1\r";
 static const char *rbiloginerrstr = "%%[Error: SecurityError; \
 SecurityViolation: Unknown user, incorrect password or log on is \
-disabled ]%%\r%%Flushing: rest of job (to end-of-file) will be \
+disabled ]%%\r%%[Flushing: rest of job (to end-of-file) will be \
 ignored ]%%\r";
 
 int cq_rbilogin( in, out )
@@ -685,9 +719,9 @@ int cq_rbilogin( in, out )
 {
     char               *start, *stop, *p, *begin;
     int                        linelength, crlflength;
-    char               username[9] = "\0";
+    char               username[UAM_USERNAMELEN + 1] = "\0";
     struct papd_comment        *comment = compeek();
-    char               uamtype[20] = "\0";
+    char               uamtype[20];
 
     for (;;) {
         switch ( markline( in, &start, &linelength, &crlflength )) {
@@ -696,6 +730,9 @@ int cq_rbilogin( in, out )
 
         case -1 :
             return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
         }
 
        stop = start + linelength;
@@ -704,20 +741,25 @@ int cq_rbilogin( in, out )
            begin = start + strlen(comment->c_begin);
            p = begin;
 
-           while (*p != ' ') {
+           while (*p != ' ' && p < stop) {
                p++;
            }
 
-           strncat(uamtype, begin, p - begin);
+           memset(uamtype, 0, sizeof(uamtype));
+           if ((size_t)(p -begin) <= sizeof(uamtype) -1) {
+               strncpy(uamtype, begin, p - begin);
+            }
 
-           if ((papd_uam = auth_uamfind(UAM_SERVER_PRINTAUTH,
+           if ( !*uamtype || (papd_uam = auth_uamfind(UAM_SERVER_PRINTAUTH,
                                uamtype, strlen(uamtype))) == NULL) {
-               LOG(log_info, logtype_default, "Could not find uam: %s", uamtype);
+               LOG(log_info, logtype_papd, "Could not find uam: %s", uamtype);
                append(out, rbiloginbad, strlen(rbiloginbad));
                append(out, rbiloginerrstr, strlen(rbiloginerrstr));
            } else {
                 if ( (papd_uam->u.uam_printer(p,stop,username,out)) == 0 ) {
                     lp_person( username );
+                   append(out, rbiloginok, strlen( rbiloginok ));
+                   LOG(log_info, logtype_papd, "RBILogin: Logged in '%s'", username);
                 } else {
                     append(out, rbiloginbad, strlen( rbiloginbad));
                     append(out, rbiloginerrstr, strlen(rbiloginerrstr));
@@ -742,16 +784,18 @@ int cq_rbilogin( in, out )
  */
 struct papd_comment    queries[] = {
 #ifdef KRB
-    { "%%Login: UMICHKerberosIV", 0,                   cq_k4login,     0 },
-    { "%%?BeginUAMethodsQuery",        "%%?EndUAMethodsQuery:", cq_uameth, C_FULL },
+    { "%%Login: UMICHKerberosIV", NULL,                        cq_k4login,     0 },
+    { "%%?BeginUAMethodsQuery",        "%%?EndUAMethodsQuery:", cq_uameth,C_FULL },
 #endif /* KRB */
-    { "%UMICHListQueue", 0,                            cq_listq, C_FULL },
-    { "%UMICHDeleteJob", 0,                            cq_rmjob,       0 },
+#ifndef HAVE_CUPS
+    { "%UMICHListQueue",       NULL,                   cq_listq,  C_FULL },
+    { "%UMICHDeleteJob",       NULL,                   cq_rmjob,       0 },
+#endif /* HAVE_CUPS */
     { "%%?BeginQuery: RBILogin ", "%%?EndQuery",       cq_rbilogin,    0 },
     { "%%?BeginQuery",         "%%?EndQuery",          cq_query,       0 },
     { "%%?BeginFeatureQuery",  "%%?EndFeatureQuery",   cq_feature,     0 },
     { "%%?BeginFontQuery",     "%%?EndFontQuery",      cq_font,        0 },
-    { "%%?BeginPrinterQuery",  "%%?EndPrinterQuery",   cq_printer, C_FULL },
+    { "%%?BeginPrinterQuery",  "%%?EndPrinterQuery",   cq_printer,C_FULL },
     { "%%?Begin",              "%%?End",               cq_default,     0 },
-    { 0 },
+    { NULL,                    NULL,                   NULL,           0 },
 };