]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Check the number of allocated wizards in vmg_gensig()
authorVincent Pit <vince@profvince.com>
Sat, 28 Feb 2009 15:18:58 +0000 (16:18 +0100)
committerVincent Pit <vince@profvince.com>
Sat, 28 Feb 2009 15:18:58 +0000 (16:18 +0100)
Magic.xs

index 0def957e72bd2b8834fe0e290fff682307b245a5..1fa63548e2a8bf86143010a61241fa57f3b57dfe 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -313,6 +313,15 @@ typedef struct {
 
 START_MY_CXT
 
+/* --- Error messages ------------------------------------------------------ */
+
+STATIC const char vmg_invalid_wiz[]    = "Invalid wizard object";
+STATIC const char vmg_invalid_sig[]    = "Invalid numeric signature";
+STATIC const char vmg_wrongargnum[]    = "Wrong number of arguments";
+STATIC const char vmg_toomanysigs[]    = "Too many magic signatures used";
+STATIC const char vmg_argstorefailed[] = "Error while storing arguments";
+STATIC const char vmg_globstorefail[]  = "Couldn't store global wizard information";
+
 /* --- Signatures ---------------------------------------------------------- */
 
 #define SIG_MIN ((U16) 0u)
@@ -330,6 +339,9 @@ STATIC U16 vmg_gensig(pTHX) {
  char buf[8];
  dMY_CXT;
 
+ if (HvKEYS(MY_CXT.wizards) >= SIG_NBR)
+  croak(vmg_toomanysigs);
+
  do {
   sig = SIG_NBR * Drand01() + SIG_MIN;
  } while (hv_exists(MY_CXT.wizards, buf, sprintf(buf, "%u", sig)));
@@ -1048,13 +1060,6 @@ STATIC MGVTBL vmg_wizard_vtbl = {
 #endif /* MGf_LOCAL */
 };
 
-STATIC const char vmg_invalid_wiz[]    = "Invalid wizard object";
-STATIC const char vmg_invalid_sig[]    = "Invalid numeric signature";
-STATIC const char vmg_wrongargnum[]    = "Wrong number of arguments";
-STATIC const char vmg_toomanysigs[]    = "Too many magic signatures used";
-STATIC const char vmg_argstorefailed[] = "Error while storing arguments";
-STATIC const char vmg_globstorefail[]  = "Couldn't store global wizard information";
-
 STATIC U16 vmg_sv2sig(pTHX_ SV *sv) {
 #define vmg_sv2sig(S) vmg_sv2sig(aTHX_ (S))
  IV sig;
@@ -1305,7 +1310,6 @@ CODE:
    XSRETURN(1);
   }
  } else {
-  if (HvKEYS(MY_CXT.wizards) >= SIG_NBR) { croak(vmg_toomanysigs); }
   sig = vmg_gensig();
  }
  
@@ -1365,8 +1369,6 @@ OUTPUT:
 SV *gensig()
 PROTOTYPE:
 CODE:
- dMY_CXT;
- if (HvKEYS(MY_CXT.wizards) >= SIG_NBR) { croak(vmg_toomanysigs); }
  RETVAL = newSVuv(vmg_gensig());
 OUTPUT:
  RETVAL