diff --git a/apps/app_sms.c b/apps/app_sms.c
index c3488b911103c628e97fc0fcf0a89bbe6575aba4..105bbe387f2ed40cec21fdaf63af188882f892f0 100644
--- a/apps/app_sms.c
+++ b/apps/app_sms.c
@@ -1176,14 +1176,13 @@ static void sms_messagetx(sms_t * h)
 static int sms_generate (struct ast_channel *chan, void *data, int len, int samples)
 {
 	struct ast_frame f = { 0 };
-	unsigned char waste[AST_FRIENDLY_OFFSET];
 #define MAXSAMPLES (800)
 #ifdef OUTALAW
-	unsigned char buf[MAXSAMPLES];
+	unsigned char *buf;
 #else
-	signed short buf[MAXSAMPLES];
+	short *buf;
 #endif
-#define SAMPLE2LEN (sizeof (buf[0]))
+#define SAMPLE2LEN sizeof(*buf)
 	sms_t *h = data;
 	int i;
 
@@ -1192,9 +1191,9 @@ static int sms_generate (struct ast_channel *chan, void *data, int len, int samp
 			 MAXSAMPLES, samples);
 		samples = MAXSAMPLES;
 	}
-	len = samples * SAMPLE2LEN;
+	len = samples * SAMPLE2LEN + AST_FRIENDLY_OFFSET;
+	buf = alloca(len);
 
-	waste[0] = 0;				 /* make compiler happy */
 	f.frametype = AST_FRAME_VOICE;
 #ifdef OUTALAW
 	f.subclass = AST_FORMAT_ALAW;
@@ -1204,7 +1203,7 @@ static int sms_generate (struct ast_channel *chan, void *data, int len, int samp
 	f.datalen = len;
 	f.offset = AST_FRIENDLY_OFFSET;
 	f.mallocd = 0;
-	f.data = buf;
+	f.data = buf + AST_FRIENDLY_OFFSET;
 	f.samples = samples;
 	f.src = "app_sms";
 	/* create a buffer containing the digital sms pattern */