diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index d3af9717fe2..31ef751e1e1 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -1440,6 +1440,9 @@ sframe_decode_fre (const char *fre_buf, sframe_frame_row_entry *fre,
   memset (fre->fre_datawords, 0, MAX_DATAWORD_BYTES);
   /* Get offsets size.  */
   datawords_sz = sframe_fre_datawords_bytes_size (fre->fre_info);
+  if (datawords_sz > MAX_DATAWORD_BYTES)
+    return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
+
   datawords = fre_buf + addr_size + sizeof (fre->fre_info);
   memcpy (fre->fre_datawords, datawords, datawords_sz);
 
@@ -1925,7 +1928,9 @@ sframe_decoder_get_fre (const sframe_decoder_ctx *ctx,
   for (i = 0; i < fdep->func_num_fres; i++)
    {
      /* Decode the FRE at the current position.  Return it if valid.  */
-     err = sframe_decode_fre (fres, &ifre, fre_type, &esz);
+     if (sframe_decode_fre (fres, &ifre, fre_type, &esz))
+       return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
+
      if (i == fre_idx)
        {
 	 if (!sframe_fre_sanity_check_p (&ifre))
@@ -2305,7 +2310,8 @@ sframe_encoder_add_fres_buf (sframe_encoder_ctx *ectx,
     {
       ectx_frep = &fre_tbl->entry[fre_tbl->count];
       /* Copy the SFrame FRE data over to the encoder object's fre_tbl.  */
-      sframe_decode_fre (fres, ectx_frep, fre_type, &esz);
+      if (sframe_decode_fre (fres, ectx_frep, fre_type, &esz))
+	return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
 
       if (!sframe_fre_sanity_check_p (ectx_frep))
 	return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL);
