Subdivision Surface modifier folds stuff. It's kind of meant for that. It smooths your mesh, it's not like it actually subdivides. It emulates subdivision placing "imaginary" vertex in middle of the existent ones. Those imaginary ones can't be edited, they move calculated by the program as you move from point to point the real ones, and when you apply the modifier, just then they come to life. There is no way to correct that bending using just the modifier, I believe.
Why don't you try, actually modifying the mesh using Space->Subdivide or in the viewport in Edit Mode: T(on left of view port) ->Subdivide ?
Be aware that will add real vertex to the thing and make it heavy if abused. Next time if you are planning on doing all with the Subsurf, start right from the start using it, and model your thing with it active. I'm telling you that doing that will turn your crazy, because the program will still smooth the planes; I mean you will be working with the vertex putting them in places that make your modified by modifier mesh "nice" to the eye, but at the moment of turning the modifier off at any given moment, you'll realize that the vertex are not actually where you put them. Because the modifier calculates stuff placing them that way so that the algorithm for the modifier shows you nice stuff.
For the time being, use the Subsurf modifier for organic stuff of smooth stuff, and not for sharp edged things like rocks, guns, etc. You can always use cylinders, cubes and subdivide them with "real subdivide". And turn on the Smooth shading in the T menu (on left of view port) in Object mode.
EDIT: Please, take a look at this page. These are the geometries you need. Although 2nd option may be better since doesn't require you to add geometry at all.
Keep sharp edges when using subdivision surface